package com.raowb.common.base.services;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 
* @Description:  
* @author: raowb
* @date 2018年8月6日
 */
public interface BaseIDService<T> extends IService<T> {
	
	
	/**
     * <p>
     * 插入一条记录（选择字段，策略插入）
     * </p>
     *
     * @param entity 实体对象
     */
    boolean save(T entity);

    /**
     * <p>
     * 插入（批量），该方法不适合 Oracle
     * </p>
     *
     * @param entityList 实体对象集合
     */
    boolean saveBatch(Collection<T> entityList);

    /**
     * <p>
     * 插入（批量）
     * </p>
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     */
    boolean saveBatch(Collection<T> entityList, int batchSize);
	
	/**
	 * <p>
	 * 删除（根据ID 批量删除）
	 * </p>
	 *
	 * @param ids 主键ID列表
	 */
	boolean delete(Serializable... ids);
	/**
	 * 
	* @Title: delete
	* @Description: 删除
	* @param wrapper
	* @return    设定文件
	* @return boolean    返回类型
	* @throws
	 */
	boolean delete(Wrapper<T> wrapper);
	
	/**
	 * 
	* @Title: update
	* @Description: 更新
	* 更新字段与field-strategy(字段策略)有关
	* @param entity
	* @return    设定文件
	* @return boolean    返回类型
	* @throws
	 */
	boolean update(T entity);
	/**
	 * 
	* @Title: update
	* @Description: 更新
	* @param entity  实体，用于生成set，null值不更新
	* @param fields 用于生成set,null值也更新 ，若与entity有相同字段，以fields更新为准
	* @return    设定文件
	* @return boolean    返回类型
	* @throws
	 */
	boolean update(T entity, Map<String, Object> fields);
	
    /**
     * <p>
     * 根据ID 批量更新
     * </p>
     *
     * @param entityList 实体对象集合
     */
    boolean updateBatch(Collection<T> entityList);

    /**
     * <p>
     * 根据ID 批量更新
     * </p>
     *
     * @param entityList 实体对象集合
     * @param batchSize  更新批次数量
     */
    boolean updateBatch(Collection<T> entityList, int batchSize);
	
    /**
     * <p>
     * TableId 注解存在更新记录，否插入一条记录
     * </p>
     *
     * @param entity 实体对象
     */
	boolean saveOrUpdate(T entity);
	
    /**
     * <p>
     * 批量修改插入
     * </p>
     *
     * @param entityList 实体对象集合
     */
    boolean saveOrUpdateBatch(Collection<T> entityList);

    /**
     * <p>
     * 批量修改插入
     * </p>
     *
     * @param entityList 实体对象集合
     * @param batchSize  每次的数量
     */
    boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
	
    /**
     * <p>
     * 根据 ID 查询
     * </p>
     *
     * @param id 主键ID
     */
	T findById(Serializable id);
	/**
     * <p>
     * 根据 ID 查询
     * </p>
     *
     * @param id 主键ID
     */
	List<T> findByIds(Serializable... ids);
	
	 /**
     * <p>
     * 根据 Wrapper，查询一条记录
     * </p>
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
	T findOne(Wrapper<T> queryWrapper);
	
	 /**
     * <p>
     * 根据 Wrapper 条件，查询总记录数
     * </p>
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    int findCount(Wrapper<T> queryWrapper);

	
    /**
     * <p>
     * 查询列表
     * </p>
     *
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    List<T> findList(Wrapper<T> queryWrapper);
    
    /**
     * <p>
     * 翻页查询
     * </p>
     *
     * @param page         翻页对象
     * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    IPage<T> findPage(IPage<T> page, Wrapper<T> queryWrapper);


	
	


}
